package com.example.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.entity.dto.LifeTool.Relationship;
import com.example.mapper.RelationGraphMapper;
import com.example.mapper.RelationshipMapper;
import com.example.service.RelationshipService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.*;

/**
 * 亲属关系服务实现类
 * 实现亲属关系推理推理逻辑，包括缓存优先查找、Mysql回退查找、字符串预处理、文本拆解等功能
 *
 * @auth shanyue
 * @date 2025年07月07日16:06
 */
@Service
public class RelationshipServiceImpl extends ServiceImpl<RelationshipMapper, Relationship> implements RelationshipService {

    @Resource
    private RelationGraphMapper relationGraphMapper;

    @Resource
    private RelationGraphCacheService relationGraphCacheService;

    /**
     * 查询所有亲属关系列表
     *
     * @return 亲属关系列表
     */
    @Override
    public List<Relationship> getRelationList() {
        //从数据库中查询所有亲属称呼记录
        return this.list();
    }

    /**
     * 根据用户输入的文本进行亲属称呼的计算
     *
     * @param text 用户输入的文本
     * @return 返回最终的亲属称呼
     */
    @Override
    public String calculateRelation(String text) {
        if (!StringUtils.hasText(text)) {
            return "请输入文本";
        }

        //===========文本预处理===========

        // 去除前后空格
        text = text.trim();
        //统一 我的 -> 我
        text = text.replaceAll("我的", "我");
        //强制保证开头是 我
        text = text.replaceAll("^我", "我"); // 确保开头是“我”

        // ===========拆分关系链===========

        //按 的 去拆分每个称呼节点
        String[] nodes = text.split("的");

        // 特殊处理，如 我爸爸 -> 我 和 爸爸
        if (nodes.length > 0 && nodes[0].length() > 1) {
            String first = nodes[0];
            if (first.startsWith("我")) {
                String firstRelation = "我";
                String restRelation = first.substring(1);
                // 构造新的节点数据
                String[] newNodes = new String[nodes.length + 1];
                newNodes[0] = firstRelation;
                newNodes[1] = restRelation;
                System.arraycopy(nodes, 1, newNodes, 2, nodes.length - 1);
                nodes = newNodes;
            }
        }

        //关系链过短
        if (nodes.length < 2) {
            return "无效文本";
        }

        // ===========关系链推理===========

        //初始为 我
        String current = nodes[0];
        for (int i = 1; i < nodes.length; i++) {
            //下一个关系节点
            String next = nodes[i];
            //优先从redis缓存中查找
            String result = relationGraphCacheService.getResultRelation(current, next);
            if (result == null) {
                //缓存中没有，从数据库总查找
                result = relationGraphMapper.findResultRelation(current, next);
                if (result != null) {
                    //回写缓存，加快下次访问速度
                    relationGraphCacheService.getHashOperations().put("relation:" + current, next, result);
                }
            }
            //如果关系不存在，终止并提示错误信息
            if (result == null) {
                return "无法识别关系" + current + "的" + next;
            }
            //更新当前节点
            current = result;
        }
        //返回最终关系称呼
        return current;
    }

}
